//////////////////////////////////////////////////////////////////////
//
// NO_OArchive.h header for the $1 class.
//
//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
#ifndef NO_OArchive_H
#define NO_OArchive_H

//////////////////////////////////////////////////////////////////////////
#include "NO_Includes.h"
#include "NO_IOABase.h"

//////////////////////////////////////////////////////////////////////////
// class NO_OArchive definition
//////////////////////////////////////////////////////////////////////////
class NO_DLL_TAL NO_OArchive : virtual public NO_IOABase   
{
public:	
	//////////////////////////////////////////////////////////////////////////
	// use
	//////////////////////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////
	virtual NO_OArchive& operator<< (NO_Object& object);

	//////////////////////////////////////////////////////////////////////////
	virtual NO_OArchive& write(NO_Boolean& object) = 0;
	virtual NO_OArchive& write(NO_Int& object) = 0;
	virtual NO_OArchive& write(NO_UInt& object) = 0;
	virtual NO_OArchive& write(NO_Int8& object) = 0;
	virtual NO_OArchive& write(NO_UInt8& object) = 0;
	virtual NO_OArchive& write(NO_SInt8& object) = 0;
	virtual NO_OArchive& write(NO_UInt16& object) = 0;
	virtual NO_OArchive& write(NO_SInt16& object) = 0;
	virtual NO_OArchive& write(NO_UInt32& object) = 0;
	virtual NO_OArchive& write(NO_SInt32& object) = 0;
	virtual NO_OArchive& write(NO_UInt64& object) = 0;
	virtual NO_OArchive& write(NO_SInt64& object) = 0;
	virtual NO_OArchive& write(NO_Float32& object) = 0;
	virtual NO_OArchive& write(NO_Float64& object) = 0;
	virtual NO_OArchive& write(std::string& object) = 0;
	virtual NO_OArchive& write(const NO_Int8* object) = 0;
	virtual NO_OArchive& write(NO_Int8* object) = 0;

	//////////////////////////////////////////////////////////////////////////
	NO_OArchive& objectBegin(NO_Object& object);
	NO_OArchive& objectEnd(NO_Object& object);

	//////////////////////////////////////////////////////////////////////////
	NO_OArchive& range(NO_Object& object);
	NO_OArchive& bases(NO_Object& object);
	NO_OArchive& members(NO_Object& object);
	NO_OArchive& functions(NO_Object& object);
	NO_OArchive& memberFunctions(NO_Object& object);

protected:
	//////////////////////////////////////////////////////////////////////////
	virtual NO_OArchive& writeBegin	(NO_Object& object) = 0;
	virtual NO_OArchive& writeEnd	(NO_Object& object) = 0;

private:
	//////////////////////////////////////////////////////////////////////////
	NO_OArchive& emptyBegin(void);
	NO_OArchive& emptyEnd(void);

};

#endif 
